package framework.helpers;

import java.util.List;
import java.util.Set;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import framework.ApplicationManager;

public class BaseHelperForRmis extends BaseHelperWithWebDriver
{
	protected String mainWindow;

	public BaseHelperForRmis(ApplicationManager app) {
		super(app);
	}
	
	/**
	 * Печатает в поле комбобокса и выбирает по номеру найденное значение
	 *
	 * @param topComboboxLocator локатор комбобокса
	 * @param text текст, который вводится в комбобокс для поиска
	 * @param num номер выбираемого элемента
	 */	
	protected void selectInCombobox(By topComboboxLocator, String text, int num) {
		WebElement combobox = findElement(topComboboxLocator);
    	WebElement textField = combobox.findElement(By.xpath("//input[@type='text']"));
    	textField.click();
    	textField.clear();
		textField.sendKeys(text);
		WebElement arrowLink = combobox.findElement(By.tagName("a"));
		arrowLink.click();
		findElements(By.cssSelector(".mosaic-widgets-dropdown-container-shown a")).get(num).click();
	}
	
	/**
	 * Печатает в поле комбобокса и выбирает по номеру найденное значение
	 *
	 * @param topComboboxLocator локатор комбобокса
	 * @param text текст, который вводится в комбобокс для поиска
	 */		
	protected void selectFirstInCombobox(By topComboboxLocator, String text) {
		selectInCombobox(topComboboxLocator, text, 0);
	}	

	/**
	 * Печатает в поле комбобокса и выбирает по номеру найденное значение
	 *
	 * @param comboboxLocator локатор комбобокса
	 * @param text текст, который вводится в комбобокс для поиска
	 * @param itemsLocator локатор элементов комбобокса
	 * @param num номер выбираемого элемента
	 */
	protected void typeAndSelectByNumber(By comboboxLocator, String text, By itemsLocator, int num) {
		WebElement element = findElement(comboboxLocator);
		WebElement arrowLink = element.findElement(By.xpath("./../../a"));
		element.click();
		element.clear();
		element.sendKeys(text);
		arrowLink.click();
		findElements(itemsLocator).get(num).click();
	}

	/**
	 * Печатает в поле комбобокса и выбирает по номеру найденное значение
	 *
	 * @param comboboxLocator локатор комбобокса
	 * @param text текст, который вводится в комбобокс для поиска
	 * @param num номер выбираемого элемента
	 */
	protected void typeAndSelectByNumber(By comboboxLocator, String text, int num) {
		typeAndSelectByNumber(comboboxLocator, text, By.cssSelector(".mosaic-widgets-dropdown-container-shown a"), num);
	}

	/**
	 * Нажатие на кнопку сохранения с пролистыванием наверх страницы и ожиданием завершения ajax 
	 *
 	 * @return текст сообщения
	 */
	protected void clickSaveButton() {
		moveToUp();
		waitWhileAjaxCompleted();
		click(By.xpath("//descendant-or-self::*[contains(concat(' ', normalize-space(@class), ' '), ' lsd-widgets-action-operation-jsSave ')]/a[contains(text(),'Сохранить')]"));
	}
	
	@Override
	protected void click(By by) {
		super.click(by);
		waitWhileAjaxCompleted();
	}

	/**
	 * Возвращает информацию о новом появившемся окне.
	 * Перед вызовом метода необходимо записать информацию о текущем окне в @see {@link #mainWindow}
	 * 
	 * @return имя нового окна
	 */
	protected String getNewWindow() {
		for (int i = 0; i < app.getIntProperty("implicitWait"); i++) {
			Set<String> windows = getWindowHandles();
			if (windows.size() != 1) {
				windows.remove(mainWindow);
				return windows.toArray()[0].toString();
			}
			sleep(1);
		}
		return null;
	}

	/**
	 * Удаляет все найденные записи в таблице
	 */
	public void cleanAllRecordsInGrid() {
		log.info("Удаление всех записей в таблице.");
		waitWhileAjaxCompleted();
		while (getCountRowInGrid() > 0) {
			chooseRowInGrid(0);
			click(By.cssSelector("[title='Удалить'] a"));
			click(By.cssSelector("[title='Да'] a"));
		}
	}

	private void chooseRowInGrid(int rowNumber) {
		click(getListOfGrid().get(rowNumber));
	}

	/**
	 * Возвращает все найденные записи в таблице
	 * 
	 * @return найденные записи в таблице
	 */
	protected List<WebElement> getListOfGrid() {
		return findElements(By.cssSelector(".x-grid-row"));
	}
	
	/**
	 * Возвращает количество найденных записей в таблице
	 * 
	 * @return количество найденных записей в таблице
	 */
	protected int getCountRowInGrid() {
		return getListOfGrid().size();
	}

	/**
	 * Перелистывает страницу наверх к элементы Выход
	 */
    protected void moveToUp() {
    	moveToElement(By.cssSelector(".lsd-header-logout"));
	}	
 
	/**
	 * Возвращает title текущей страницы
	 * 
	 * @return title текущей страницы
	 */
	public String getTitle() {
		String title = app.getWebDriverHelper().getDriver().getTitle();
		log.info("title = " + title);
		return title;
	}
	
	/**
	 * Закрывает всплывающее окно в правом верхнем углу
	 */
	protected void closeUpperRightCornerMessage(){
		click(By.cssSelector(".dc-console-close"));
	}
}
